<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Promise.all 方法</title>
</head>
<body>
    
</body>
</html>
<script>
    // 2021-08-08 补充 



    //Promise.all方法 用于将多个Promise实例包装成 一个新的Promise实例 
    //一个非常常见的场景，比如，你现在有三个api，分别获取用户信息，购物车信息，商品信息，三者信息同时拉取完才能进行业务渲染。
            //  var p = Promise.all([p1,p2,p3])
    //上面的代码中 Promise.all方法接收一个数组作为参数
    //p1 p2 p3 都是Promise对象的实例  

    //如果不是 就会先调用下面讲到的Promise.resolve方法 将参数转为Promise实例 再进一步处理 
    //方法参数不一定是数组 但是必须具有Iterator接口 且返回的每个成员都是Promise 实例)
    
    // 实例p的状态由p1 p2 p3 决定 
    // 分成两种情况 
    // 1 只有3个实例 p1 p2 p3 的状态都变成Fulfilled(成功) p的状态才会变成Fulfilled 
    //   此时p1 p2 p3的返回值为一个数组 传递给p的 回调函数 

    // 2 注意只要p1 p2 p3中有一个被Rejected p的状态就变成Rejected 
    //   此时第一个被Rejected的实例的返回值 传递给p的回调函数 

    //demo示例 
    //生成一个Promise对象的数组
    //promises实例是一个包含6个Promise实例的数组 只有这6个状态都变成fulfilled 
    //或者其中有一个变成rejected 才会调用Promis.all方法后面的回调函数   
            // const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
            //     return getJSON('/post/' + id + ".json");
            // });
            // Promise.all(promises).then(function (posts) {
            //     // ...
            // }).catch(function(reason){
            //     // ...
            // });


//  封装好的.all
    function promiseAll(promises){
            return new Promise(function(resolve,reject){ //在函数里面返回一个Promise对象 
                if(!Array.isArray(promises)){            //判断不是一个数组抛出err
                    return reject(new TypeError("argument must be an array"))
                }

                var countNum = 0;                        //初始化
                var promiseNum = promises.length;        //给传入参数的长度赋值一个变量
                var resolvedvalue =new Array(promiseNum);//创建数组传入length

                for(let i=0;i<promiseNum;i++){
                    Promise.resolve(promises[i]).then(function(value){
                        countNum++;
                        resolvedvalue[i]=value;
                        if(countNum===promiseNum){
                            return resolve(resolvedvalue)
                        }
                    },function(reason){
                        return reject(reason)}
                    )
                
            }
        })
}
let p1 = new Promise((resolve,reject)=>{
    resolve(1)
})
let p2 = new Promise((resolve,reject)=>{
    resolve(2)
})
let p3 = new Promise((resolve,reject)=>{
    resolve(3)
})
 
promiseAll([p1,p2,p3]).then(function(value){
    console.log(value)
})


</script>